From: Keir Fraser Date: Wed, 13 May 2009 09:39:44 +0000 (+0100) Subject: x86 vmx: Ensure debug-mode intercept for int3 and debug exceptions are X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~13927 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=76bc713dd7fd13efa92fc129ac3910a1d00a4fda;p=xen.git x86 vmx: Ensure debug-mode intercept for int3 and debug exceptions are reinstated when resetting EXCEPTION_BIRTMAP entry in VMCS after exiting real mode. Signed-off-by: Keir Fraser --- diff --git a/xen/arch/x86/hvm/vmx/vmcs.c b/xen/arch/x86/hvm/vmx/vmcs.c index c86b55e6f7..aea69c7b94 100644 --- a/xen/arch/x86/hvm/vmx/vmcs.c +++ b/xen/arch/x86/hvm/vmx/vmcs.c @@ -912,18 +912,8 @@ void vmx_do_resume(struct vcpu *v) debug_state = v->domain->debugger_attached; if ( unlikely(v->arch.hvm_vcpu.debug_state_latch != debug_state) ) { - unsigned long intercepts = __vmread(EXCEPTION_BITMAP); - unsigned long mask = 1u << TRAP_int3; - - if ( !cpu_has_monitor_trap_flag ) - mask |= 1u << TRAP_debug; - v->arch.hvm_vcpu.debug_state_latch = debug_state; - if ( debug_state ) - intercepts |= mask; - else - intercepts &= ~mask; - __vmwrite(EXCEPTION_BITMAP, intercepts); + vmx_update_debug_state(v); } hvm_do_resume(v); diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index ff200cb5f1..64d9f39c89 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -1035,6 +1035,24 @@ static void vmx_update_host_cr3(struct vcpu *v) vmx_vmcs_exit(v); } +void vmx_update_debug_state(struct vcpu *v) +{ + unsigned long intercepts, mask; + + ASSERT(v == current); + + mask = 1u << TRAP_int3; + if ( !cpu_has_monitor_trap_flag ) + mask |= 1u << TRAP_debug; + + intercepts = __vmread(EXCEPTION_BITMAP); + if ( v->arch.hvm_vcpu.debug_state_latch ) + intercepts |= mask; + else + intercepts &= ~mask; + __vmwrite(EXCEPTION_BITMAP, intercepts); +} + static void vmx_update_guest_cr(struct vcpu *v, unsigned int cr) { vmx_vmcs_enter(v); @@ -1107,6 +1125,7 @@ static void vmx_update_guest_cr(struct vcpu *v, unsigned int cr) | (paging_mode_hap(v->domain) ? 0 : (1U << TRAP_page_fault)) | (1U << TRAP_no_device)); + vmx_update_debug_state(v); } } diff --git a/xen/include/asm-x86/hvm/vmx/vmx.h b/xen/include/asm-x86/hvm/vmx/vmx.h index 6fd989431d..97cf7635ff 100644 --- a/xen/include/asm-x86/hvm/vmx/vmx.h +++ b/xen/include/asm-x86/hvm/vmx/vmx.h @@ -60,6 +60,7 @@ void vmx_intr_assist(void); void vmx_do_resume(struct vcpu *); void vmx_vlapic_msr_changed(struct vcpu *v); void vmx_realmode(struct cpu_user_regs *regs); +void vmx_update_debug_state(struct vcpu *v); /* * Exit Reasons